// Copyright 2012 Google Inc. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package com.google.collide.client.util.logging; import com.google.collide.client.util.ExceptionUtils; import com.google.collide.client.util.logging.LogConfig.LogLevel; import com.google.gwt.core.client.GWT; import com.google.gwt.core.client.JavaScriptObject; /** * Simple Logging class that logs to the browser's console and to the DevMode * console (if you are in DevMode). * * So long as generating the parameters to pass to the logging methods is free * of side effects, all Logging code should compile out of your application if * logging is disabled. */ public class Log { public static void debug(Class<?> clazz, Object... args) { if (LogConfig.isLoggingEnabled()) { // DEBUG is the lowest log level, but we use <= for consistency, and in // case we ever decide to introduce a SPAM level. if (LogConfig.getLogLevel().ordinal() <= LogLevel.DEBUG.ordinal()) { log(clazz, LogLevel.DEBUG, args); } } } public static void error(Class<?> clazz, Object... args) { if (LogConfig.isLoggingEnabled()) { log(clazz, LogLevel.ERROR, args); } } public static void info(Class<?> clazz, Object... args) { if (LogConfig.isLoggingEnabled()) { if (LogConfig.getLogLevel().ordinal() <= LogLevel.INFO.ordinal()) { log(clazz, LogLevel.INFO, args); } } } public static boolean isLoggingEnabled() { return LogConfig.isLoggingEnabled(); } public static void warn(Class<?> clazz, Object... args) { if (LogConfig.isLoggingEnabled()) { if (LogConfig.getLogLevel().ordinal() <= LogLevel.WARNING.ordinal()) { log(clazz, LogLevel.WARNING, args); } } } public static void markTimeline(Class<?> clazz, String label) { if (LogConfig.isLoggingEnabled()) { markTimelineUnconditionally(label + "(" + clazz.getName() + ")"); } } // TODO: markTimeLine is deprecated; remove it someday. public static native void markTimelineUnconditionally(String label) /*-{ if ($wnd.console) { if ($wnd.console.timeStamp) { $wnd.console.timeStamp(label); } else if ($wnd.console.markTimeline) { $wnd.console.markTimeline(label); } } }-*/; private static native void invokeBrowserLogger(String logFuncName, Object o) /*-{ if ($wnd.console && $wnd.console[logFuncName]) { $wnd.console[logFuncName](o); } return; }-*/; private static void log(Class<?> clazz, LogLevel logLevel, Object... args) { String prefix = new StringBuilder(logLevel.toString()) .append(" (") .append(clazz.getName()) .append("): ") .toString(); for (Object o : args) { if (o instanceof String) { logToDevMode(prefix + (String) o); logToBrowser(logLevel, prefix + (String) o); } else if (o instanceof Throwable) { Throwable t = (Throwable) o; logToDevMode(prefix + "(click for stack)", t); logToBrowser(logLevel, prefix + ExceptionUtils.getStackTraceAsString(t)); } else if (o instanceof JavaScriptObject) { logToDevMode(prefix + "(JSO, see browser's console log for details)"); logToBrowser(logLevel, prefix + "(JSO below)"); logToBrowser(logLevel, o); } else { logToDevMode(prefix + (o != null ? o.toString() : "(null)")); logToBrowser(logLevel, prefix + (o != null ? o.toString() : "(null)")); } } } private static void logToBrowser(LogLevel logLevel, Object o) { switch (logLevel) { case DEBUG: invokeBrowserLogger("debug", o); break; case INFO: invokeBrowserLogger("info", o); break; case WARNING: invokeBrowserLogger("warn", o); break; case ERROR: invokeBrowserLogger("error", o); break; default: invokeBrowserLogger("log", o); } } private static void logToDevMode(String msg) { if (!GWT.isScript()) { GWT.log(msg); } } private static void logToDevMode(String msg, Throwable t) { if (!GWT.isScript()) { GWT.log(msg, t); } } }